home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1996
/
MacHack 1996.toast
/
Hacks
/
Hacks ’87
/
Source ƒ.sit
/
Source ƒ
/
C ƒ
/
CITADEL BBS 'C' SRC
/
NETMISC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1987-01-14
|
31KB
|
1,069 lines
/************************************************************************/
/* netmisc.c */
/* */
/* Networking functions of miscellaneous type. */
/************************************************************************/
/************************************************************************/
/* history */
/* */
/* 86Aug20 HAW History not maintained due to space problems. */
/************************************************************************/
#include "ctdl.h"
/************************************************************************/
/* contents */
/* */
/************************************************************************/
/************************************************************************/
/* External variable declarations in NET.C */
/************************************************************************/
#ifdef NET_BUG
FILE *localcheck;
#endif
FILE *netLog, *netMisc;
char logNetResults = FALSE;
ulong roomHiMsgs[MAXROOMS];
char inNet = FALSE;
unsigned char sectBuf[SECTSIZE + 5];
int counter;
int callSlot;
int FinHour, FinMinute;
label normed, callerName, callerId;
int noKill, errCount = 0;
char normId(), getNetMessage();
char callOut();
unsigned char inp();
static char *SupportedBauds[] = { "300", "300/1200", "300/1200/2400" };
struct nodeRoomsTab *sharedRooms;
/************************************************************************/
/* External variable definitions for NET.C */
/************************************************************************/
extern struct config cfg; /* Lots an lots of variables */
extern struct logBuffer logBuf; /* Person buffer */
extern struct aRoom roomBuf; /* Room buffer */
extern struct rTable roomTab[];
extern struct msgB msgBuf,tempMess;
extern struct netBuffer netBuf;
extern struct netTable *netTab;
extern FILE *upfd;
extern int thisNet;
extern char onConsole;
extern char loggedIn; /* Is we logged in? */
extern char outFlag; /* Output flag */
extern char haveCarrier; /* Do we still got carrier? */
extern unsigned char modStat; /* Needed so we don't die */
extern char usingWCprotocol;/* WC flag */
extern char WCError;
extern int thisRoom;
extern int thisLog;
extern char *dotdot;
extern char *confirm;
/************************************************************************/
/* External function definitions for NET.C */
/************************************************************************/
FILE *safeopen();
FILE *fopen();
char *realloc();
char *index();
long getNumber();
/************************************************************************/
/* netSingleSend() Send a file via WC */
/************************************************************************/
sendWCFile(fd)
FILE *fd;
{
int data;
if (doWC(STARTUP)) {
while ((data = fgetc(fd)) != EOF && data != -1)
if (!sendWCChar(data)) break;
doWC(FINISH);
}
fclose(fd);
}
/************************************************************************/
/* increment() */
/************************************************************************/
increment(c)
unsigned char c;
{
sectBuf[counter++] = c;
if (counter > SECTSIZE+2) {
interpret(cfg.pHangUp);
modStat = haveCarrier = FALSE;
}
return TRUE;
}
/************************************************************************/
/* normId() Normalizes a node id. */
/************************************************************************/
char normId(source, dest)
label source, dest;
{
while (!isalpha(*source) && *source)
source++;
if (!*source) return FALSE;
*dest++ = toUpper(*source++);
while (!isalpha(*source) && *source)
source++;
if (!*source) return FALSE;
*dest++ = toUpper(*source++);
while (*source) {
if (isdigit(*source))
*dest++ = *source;
source++;
}
*dest = '\0';
return TRUE;
}
/************************************************************************/
/* called_stabilize() Attempts to stabilize communication on */
/* receiver end. */
/************************************************************************/
called_stabilize()
{
int Time = 0, f, baudRunner = 0;
char noGood, notFinished, notDone = TRUE;
char laterMessage[100];
pause(100); /* Pause a full second */
while (notDone) {
noGood = TRUE;
if (cfg.search_baud) {
while (MIReady()) inp(); /* Clear garbage */
while (gotCarrier() && noGood && Time < 20) {
Time++;
for (notFinished = TRUE; noGood && gotCarrier() && notFinished;){
interpret(cfg.pBauds[baudRunner]);
noGood = check_for_init();
if (cfg.debug) splitF(netLog, ".\n");
notFinished = !(baudRunner == cfg.sysBaud);
baudRunner = (baudRunner + 1) % (cfg.sysBaud + 1);
}
}
}
else {
interpret(cfg.pBauds[interpret(cfg.pCheckBaud)]);
for (; gotCarrier() && Time < 20 && noGood; Time++) {
noGood = check_for_init();
if (cfg.debug) splitF(netLog, ".\n");
}
if (cfg.debug) splitF(netLog, "\n");
}
if (!gotCarrier()) {
modStat = haveCarrier = FALSE;
splitF(netLog, "Lost carrier\n");
return FALSE;
}
if (noGood && Time == 20) {
outFlag = IMPERVIOUS;
sPrintf(laterMessage,
"System will be in network mode for another %d minutes; please call back.\n",
timeLeft());
if (cfg.search_baud) {
for (baudRunner = cfg.sysBaud; baudRunner > -1; baudRunner--) {
interpret(cfg.pBauds[baudRunner]);
mPrintf(laterMessage);
}
}
else
mPrintf(laterMessage);
interpret(cfg.pHangUp);
notDone = modStat = haveCarrier = FALSE;
outFlag = OUTOK;
}
else {
if (cfg.debug) splitF(netLog, "&");
outMod(~7 );
outMod(~13);
outMod(~69);
f = receive(2);
if (f == ACK)
return TRUE ;
else if (cfg.debug) splitF(netLog, "%d ", f);
if (!gotCarrier())
modStat = haveCarrier = notDone = FALSE;
}
}
if (!gotCarrier())
modStat = haveCarrier = FALSE;
return FALSE;
}
/************************************************************************/
/* check_for_init() Looks for networking initialization sequence */
/************************************************************************/
check_for_init()
{
int count, timeOut;
unsigned char thisVal, lastVal;
lastVal = 0;
timeOut = (INTERVALS / 2) * (500);
for (count = 0; count < timeOut; count++) {
if (MIReady()) {
thisVal = inp();
if (cfg.debug) splitF(netLog, "%d ", thisVal);
switch (thisVal) {
case 7: lastVal = 7; break;
case 13:
if (lastVal == 7) lastVal = 13;
else lastVal = 0;
break;
case 69:
if (lastVal == 13) return FALSE;
else lastVal = 0;
break;
default:
lastVal = 0;
}
}
else shortPause();
}
return TRUE;
}
/************************************************************************/
/* searchNet() Searches net for the given Id. */
/************************************************************************/
searchNet(forId)
char *forId;
{
int rover;
label temp;
for (rover = 0; rover < cfg.netSize; rover++) {
if (netTab[rover].ntflags.in_use &&
hash(forId) == netTab[rover].ntidhash) {
getNet(rover);
normId(netBuf.netId, temp);
if (strCmpU(temp, forId) == SAMESTRING)
return rover;
}
}
return ERROR;
}
/************************************************************************/
/* readMail() Integrates mail into the data base */
/************************************************************************/
readMail(zap, procFn)
char zap;
int (*procFn)();
{
label tempNm;
strCpy(tempNm, "a:tempmail.$$$");
tempNm[0] = cfg.netDisk + 'a';
if ((netMisc = safeopen(tempNm, "rb")) == NULL) {
no_good("Couldn't open tempmail file from %s.", TRUE);
return;
}
getRoom(MAILROOM);
noKill = FALSE;
while (getNetMessage()) {
if (strCmpU(cfg.nodeId + cfg.codeBuf, tempMess.mborig) != SAMESTRING)
/* inMail(); */
(*procFn)();
}
fclose(netMisc);
if (zap && !noKill) unlink(tempNm);
else if (zap) {
sPrintf(msgBuf.mbtext, "%c:temp%d.$$$", cfg.netDisk + 'a', errCount++);
rename(tempNm, msgBuf.mbtext);
}
}
/************************************************************************/
/* getNetMessage() gets a message from a global file */
/************************************************************************/
char getNetMessage()
{
int marker, c;
zero_struct(tempMess);
marker = 0;
while (marker != 'M') {
while ((marker = getc(netMisc)) != -1 && marker == ' ')
;
if (marker == -1) {
return FALSE;
}
switch (marker) {
case 'A':
getNetStr(tempMess.mbauth);
break;
case 'D':
getNetStr(tempMess.mbdate);
break;
case 'N':
getNetStr(tempMess.mboname);
break;
case 'O':
getNetStr(tempMess.mborig);
break;
case 'R':
getNetStr(tempMess.mbroom);
break;
case 'S':
getNetStr(tempMess.mbsrcId);
break;
case 'T':
getNetStr(tempMess.mbto);
break;
case 'C':
getNetStr(tempMess.mbtime);
break;
default:
if (marker != 'M')
while ((c = getc(netMisc)) != -1 && c != '\0')
;
break;
}
}
getNetStr(tempMess.mbtext);
return TRUE;
}
/************************************************************************/
/* getNetStr() gets a string from networked message */
/************************************************************************/
getNetStr(place)
char *place;
{
int i, c;
i = 0;
do {
c = getc(netMisc);
if (c == '\r') c = '\n';
place[i++] = c;
} while (c != -1 && c != '\0');
}
/************************************************************************/
/* inMail() integrates mail into database */
/************************************************************************/
inMail()
{
int logNo;
struct logBuffer lBuf;
if (!tempMess.mbto[0]) {
splitF(netLog, "'to' error\n");
noKill = TRUE;
return ;
}
logNo = findPerson(tempMess.mbto, &lBuf);
strCpy(msgBuf.mbto, tempMess.mbto);
if (logNo == ERROR && hash(tempMess.mbto) != hash("Sysop")) {
splitF(netLog, "Mail to '%s' cannot be delivered.\n", tempMess.mbto);
return;
}
else splitF(netLog, "Delivering mail to '%s'\n", tempMess.mbto);
if (strCmpU(tempMess.mbto, "sysop") != 0)
strCpy(tempMess.mbto, lBuf.lbname);
putNetMessage();
noteMessage(&lBuf, logNo);
}
/************************************************************************/
/* netController() Handles the net stuff */
/************************************************************************/
netController()
{
int x;
int searcher = 0, start, first;
label name;
ulong waitTime, count;
int yr, hr, min, dy;
char *mn;
getdate(&yr, &mn, &dy, &hr, &min);
if (logNetResults) {
sPrintf(name, "%c:netlog.sys", cfg.homeDisk + 'a');
netLog = fopen(name, "a");
}
else
netLog = NULL;
inNet = TRUE;
loggedIn = FALSE; /* Let's be VERY sure. */
thisLog = -1;
splitF(netLog, "\n---------------In Networking Mode--------------\n%d%s%02d\n",
yr, mn, dy);
modStat = haveCarrier = FALSE;
setTime();
initNetRooms();
while ((x = timeLeft()) > 0) { /* "Can we say inefficient?" */
waitTime = (cfg.catChar % 5) + 1;
while (waitTime > minimum(5, ((x/2)))) waitTime /= 2;
/* for (count = 0; count < waitTime * 6000; count++) { */
for (count = 0; count < waitTime * 6000 && !KBReady(); count++) {
pause(1);
if (gotCarrier()) break;
}
if(KBReady()) getCh();
if (gotCarrier()) {
modStat = haveCarrier = TRUE;
called();
}
if (cfg.netSize != 0) {
start = searcher;
do {
if (needToCall(searcher)) {
if (callOut(searcher))
caller();
for (count = 0; count < 20 && !gotCarrier(); count++)
/* Give the modem a chance to recover */
pause(50);
if (gotCarrier()) {
modStat = haveCarrier = TRUE;
called();
}
}
searcher = (searcher + 1) % cfg.netSize;
} while ((searcher+1) % cfg.netSize != start);
}
}
splitF(netLog, "\n---------------Out of Networking Mode--------------\n\n\n");
for (searcher = 0; searcher < cfg.netSize; searcher++)
if (needToCall(searcher)) break;
if (searcher < cfg.netSize) {
sPrintf(msgBuf.mbtext, "The following systems could not be reached: ");
for (searcher = 0, first = 1; searcher < cfg.netSize; searcher++)
if (needToCall(searcher)) {
if (!first) strCat(msgBuf.mbtext,", ");
first = FALSE;
getNet(searcher);
strCat(msgBuf.mbtext, netBuf.netName);
}
strCat(msgBuf.mbtext, ".");
aideMessage(FALSE);
}
free(sharedRooms);
setSharedRooms();
interpret(cfg.pInitPort);
modStat = haveCarrier = FALSE;
inNet = FALSE;
if (logNetResults) {
fclose(netLog);
}
}
/************************************************************************/
/* initNetRooms() Initializes buncha flags 'n things. Kludgey. */
/************************************************************************/
initNetRooms()
{
int rover, i;
for (rover = 0; rover < cfg.netSize; rover++) {
getNet(rover);
if (netBuf.nbflags.in_use) {
for (i = 0; i < SHARED_ROOMS; i++) {
resetNeedsProcessing(i);
}
putNet(rover);
}
}
}
/************************************************************************/
/* setTime() Sets up some global variables for the networker */
/************************************************************************/
setTime()
{
int yr, hr, min, dy;
char *mn;
getdate(&yr, &mn, &dy, &hr, &min);
FinHour = hr + cfg.netLength / 60;
FinMinute = cfg.netLength % 60;
}
/************************************************************************/
/* timeLeft() Does a rough estimate of how much time left */
/************************************************************************/
int timeLeft()
{
int yr, hr, min, dy;
char *mn;
getdate(&yr, &mn, &dy, &hr, &min);
if (hr == FinHour && min > FinMinute) return -1;
if (hr > FinHour) return -1;
return ((FinHour - hr) * 60 + abs(min - FinMinute));
}
/************************************************************************/
/* callOut() Attempts to call some other system. */
/************************************************************************/
char callOut(i)
int i;
{
char call[80];
label blip1;
getNet(callSlot = i);
strCpy(normed, netBuf.netId); /* Cosmetics */
strCpy(callerId, netBuf.netId);
strCpy(callerName, netBuf.netName);
splitF(netLog, "Calling %s @ %s: ", netBuf.netName, netBuf.netId);
interpret(cfg.pBauds[minimum(netBuf.baudCode, cfg.sysBaud)]);
normId(netBuf.netId, blip1);
strCpy(call, cfg.codeBuf + cfg.netPrefix);
if (!netBuf.nbflags.local) {
if (!cfg.longHaul)
crashout("Supposed to call long distance when LONG-HAUL is 0?");
strCat(call, "1");
strCat(call, blip1 + 2);
}
else {
strCat(call, blip1 + 5);
}
strCat(call, cfg.codeBuf + cfg.netSuffix);
moPuts(call);
for (i = 0; i < 4000; i++) {
pause(1);
if (gotCarrier()) break;
}
if (gotCarrier())
return modStat = haveCarrier = TRUE;
outMod('\r'); /* Take SmartModem out of call mode */
splitF(netLog, "No luck.\n");
return FALSE;
}
/************************************************************************/
/* moPuts() Put a string out to modem without carr check */
/************************************************************************/
moPuts(s)
char *s;
{
while (*s) {
pause(5);
if (cfg.debug) putchar(*s);
outMod(*s++);
}
}
/************************************************************************/
/* netMessage() Send message via net */
/************************************************************************/
netMessage(uploading)
char uploading;
{
extern char *ALL_LOCALS;
extern char *R_SH_MARK;
char notDone = TRUE;
label sys;
char *address;
if (!cfg.netParticipant) {
mPrintf("This Citadel is not participating in the net.\n ");
return;
}
zero_struct(msgBuf);
if (!loggedIn || !logBuf.lbflags.NET_PRIVS) {
mPrintf("Sorry, you don't have net privileges.\n ");
return;
}
if (thisRoom == MAILROOM) {
do {
getString("system to send to", sys, 20, TRUE, ECHO);
if (strLen(sys) == 0) return;
if (sys[0] == '?')
writeNet(FALSE);
else {
if (searchNameNet(sys) == ERROR && strCmpU(sys, ALL_LOCALS) != 0)
mPrintf("No such system currently part of the net\n ");
else
notDone = FALSE;
}
} while (notDone);
if (strCmpU(sys, ALL_LOCALS) != 0) {
getNet(searchNameNet(sys));
if (!cfg.longHaul && !netBuf.nbflags.local) {
mPrintf("Sorry, local Citadels only, please.\n ");
return;
}
if (!netBuf.nbflags.local && logBuf.credit == 0) {
mPrintf("Sorry, you have no credit for long distance net.\n ");
return;
}
address = netBuf.netName;
}
else {
if (!logBuf.lbflags.AIDE) {
mPrintf("Sorry, you don't have announcement privileges.\n ");
return;
}
address = ALL_LOCALS;
}
}
else {
if (!roomBuf.rbflags.SHARED) {
mPrintf("This is not a network room\n ");
return;
}
address = R_SH_MARK;
strCpy(msgBuf.mboname, cfg.codeBuf + cfg.nodeName);
}
strCpy(msgBuf.mbaddr, address);
procMessage(uploading);
}
/************************************************************************/
/* writeNet() write up nodes on the net. */
/************************************************************************/
writeNet(idsAlso)
char idsAlso;
{
int rover;
outFlag = OUTOK;
mPrintf("Systems on the net:\n ");
for (rover = 0; rover < cfg.netSize; rover++) {
getNet(rover);
if (netBuf.nbflags.in_use) {
mPrintf("%-22s", netBuf.netName);
if (idsAlso) mPrintf("%-22s%-16s%s", netBuf.netId,
(needToCall(rover)) ? "<need to call>" : "",
SupportedBauds[netBuf.baudCode]);
mPrintf("\n ");
}
}
if (!idsAlso) mPrintf("'&L' == Local Systems Announcement\n ");
}
/************************************************************************/
/* searchNameNet() Search net for given node name */
/************************************************************************/
searchNameNet(name)
label name;
{
int rover;
for (rover = 0; rover < cfg.netSize; rover++) {
if (netTab[rover].ntflags.in_use &&
hash(name) == netTab[rover].ntnmhash) {
getNet(rover);
if (strCmpU(netBuf.netName, name) == SAMESTRING)
return rover;
}
}
return ERROR;
}
/************************************************************************/
/* netStuff() Handles networking for the sysop */
/************************************************************************/
netStuff()
{
extern char *who_str;
label who;
struct logBuffer lBuf;
int logNo;
do {
outFlag = OUTOK;
mPrintf("\n Net function: ");
switch (toUpper(iChar())) {
case 'R':
mPrintf("equest File\n ");
fileRequest();
break;
case 'X':
mPrintf("\bExit to main menu");
return;
case 'C':
mPrintf("redit setting\n ");
getNormStr(who_str, who, NAMESIZE, ECHO);
logNo = findPerson(who, &lBuf);
if (logNo == ERROR) {
mPrintf("No such person\n ");
break;
}
mPrintf("%s currently has %d credits.", who, lBuf.credit);
lBuf.credit = (int) getNumber("How many now", 0l, 255l);
if (loggedIn && strCmpU(logBuf.lbname, who) == SAMESTRING)
logBuf.credit = lBuf.credit;
putLog(&lBuf, logNo);
break;
case 'V':
mPrintf("iew net list\n ");
writeNet(TRUE);
break;
case 'A':
mPrintf("dd node to net\n ");
addNetNode();
break;
case 'E':
mPrintf("dit a node\n ");
editNode();
break;
case 'N':
mPrintf("et privilege toggle\n ");
getNormStr(who_str, who, NAMESIZE, ECHO);
logNo = findPerson(who, &lBuf);
if (logNo == ERROR) {
mPrintf("No such person\n ");
break;
}
mPrintf(
"%s has %snet privileges\n ",
who,
(lBuf.lbflags.NET_PRIVS) ? "no " : ""
);
if (!getYesNo(confirm)) break;
lBuf.lbflags.NET_PRIVS = !lBuf.lbflags.NET_PRIVS;
if (strCmpU(lBuf.lbname, logBuf.lbname) == SAMESTRING)
logBuf.lbflags.NET_PRIVS = lBuf.lbflags.NET_PRIVS;
putLog(&lBuf, logNo);
break;
case '?':
tutorial("netopt.mnu");
break;
default:
mPrintf(" ?\n ");
}
} while (onLine());
}
/************************************************************************/
/* addNetNode() Add a node to the net listing */
/************************************************************************/
addNetNode()
{
int searcher, i;
char goodAnswer;
label temp;
zero_struct(netBuf); /* Useful initialization */
do {
getNormStr("System name", netBuf.netName, NAMESIZE, ECHO);
if (strLen(netBuf.netName) == 0) return;
if ((goodAnswer = strCmpU(ALL_LOCALS, netBuf.netName)) == 0)
mPrintf("Sorry, reserved name\n ");
} while (!goodAnswer);
getString("System ID", netBuf.netId, NAMESIZE, FALSE, ECHO);
if (strLen(netBuf.netId) == 0) return;
netBuf.baudCode = (int) getNumber(
"Baud code (0=300, 1=300/1200, 2=300/1200/2400)", 0l, 2l);
netBuf.nbflags.local = getYesNo("Is system local");
netBuf.nbflags.in_use = TRUE;
for (searcher = 0; searcher < cfg.netSize; searcher++)
if (netTab[searcher].ntflags.in_use == FALSE) break;
if (searcher != cfg.netSize)
putNet(searcher);
else {
netTab =
(struct netTable *) realloc(netTab, sizeof (*netTab) * ++cfg.netSize);
sharedRooms =
(struct nodeRoomsTab *) realloc(sharedRooms, sizeof (*sharedRooms) *
cfg.netSize);
searcher = cfg.netSize - 1;
putNet(searcher);
}
normId(netBuf.netId, temp);
netTab[searcher].ntnmhash = hash(netBuf.netName);
netTab[searcher].ntidhash = hash(temp);
zero_struct(sharedRooms[searcher].rooms);
}
/************************************************************************/
/* editNode() Edit a net node */
/************************************************************************/
editNode()
{
label sysname, temp;
int place;
getNormStr("Name of system to edit", sysname, NAMESIZE, ECHO);
if ((place = searchNameNet(sysname)) == ERROR) {
mPrintf("%s not listed!\n ", sysname);
return;
}
getNet(place);
mPrintf("\n Node %s:\n Id: %s", netBuf.netName, netBuf.netId);
mPrintf("\n System is a %slocal system, ",
(netBuf.nbflags.local) ? "" : "non-");
mPrintf("and the baud setting is for %s.\n ",
SupportedBauds[netBuf.baudCode]);
mPrintf("There is %soutgoing mail, ",
(netBuf.nbflags.normal_mail) ? "" : "no ");
mPrintf("and there are %sfile requests outstanding.\n ",
(netBuf.nbflags.room_files) ? "" : "no ");
while (1) {
outFlag = OUTOK;
mPrintf("\n (%s) edit fn: ", netBuf.netName);
switch (toUpper(iChar())) {
case 'Z': dumpNodeRoom(FALSE);
break;
case 'X':
mPrintf("\bExit to net menu");
normId(netBuf.netId, temp);
netTab[place].ntnmhash = hash(netBuf.netName);
netTab[place].ntidhash = hash(temp);
netTab[place].ntflags.in_use = netBuf.nbflags.in_use;
putNet(place);
return;
case 'B':
mPrintf("aud code change\n ");
netBuf.baudCode = (int) getNumber(
"Baud code (0=300, 1=300/1200, 2=300/1200/2400)", 0l, 2l);
break;
case 'N':
mPrintf("ame change\n ");
getNormStr("System name", temp, NAMESIZE, ECHO);
if (strLen(temp) != 0) strCpy(netBuf.netName);
break;
case 'I':
mPrintf("D change\n ");
getString("System ID", temp, NAMESIZE, FALSE, ECHO);
if (strLen(temp) != 0) strCpy(netBuf.netId);
break;
case 'K':
mPrintf("ill node from list\n ");
if (netBuf.nbflags.normal_mail)
mPrintf("There is outgoing mail outstanding.\n ");
if (netBuf.nbflags.room_files)
mPrintf("There are file requests outstanding.\n ");
if (getYesNo("Confirm")) {
netBuf.nbflags.in_use = FALSE;
putNet(place);
sPrintf(temp, "a:%d.ml", thisNet);
temp[0] = cfg.netDisk + 'a';
unlink(temp);
sPrintf(temp, "a:%d.rfl", thisNet);
temp[0] = cfg.netDisk + 'a';
unlink(temp);
return;
}
break;
case 'L':
mPrintf("ocal setting\n ");
netBuf.nbflags.local = getYesNo("Is system local");
break;
case '?':
tutorial("netedit.mnu");
break;
default:
mPrintf("?\n ");
}
}
}
/************************************************************************/
/* inNetTime() Time to network? */
/************************************************************************/
inNetTime(hr, mn)
int hr, mn;
{
int thisHour, thisMin;
thisHour = cfg.netHour + (cfg.netLength / 60);
thisMin = cfg.netLength - ((thisHour - cfg.netHour) * 60);
if (hr < cfg.netHour) return FALSE;
if (hr > thisHour) return FALSE;
if (mn >= thisMin) return FALSE;
return TRUE;
}
/************************************************************************/
/* fileRequest() For network requests of files. */
/************************************************************************/
fileRequest()
{
struct fl_req file_data;
label system, dr, data;
char loc[100];
char abort, goodname;
FILE *temp;
char *cd, *gcdir();
int place;
char ambiguous;
getNormStr("system to request file from", system, NAMESIZE, ECHO);
if (strLen(system) == 0) return;
if ((place = searchNameNet(system)) == ERROR) {
mPrintf("%s not listed!\n ", system);
return;
}
getNet(place);
sPrintf(loc, "name of room on %s that has desired file", system);
getNormStr(loc, file_data.room, NAMESIZE, ECHO);
if (strLen(file_data.room) == 0) return;
getNormStr("the file(s)'s name", file_data.roomfile, NAMESIZE, ECHO);
if (strLen(file_data.roomfile) == 0) return;
ambiguous = !(index(file_data.roomfile, '*') == NULL &&
index(file_data.roomfile, '?') == NULL);
getString("what drive you want the file put on", dr, 2, FALSE, ECHO);
if (strLen(dr) == 0) return;
file_data.drive = dr[0];
mPrintf("Now we want to specify the exact directory on drive ");
mPrintf("%c to place the file in. ", toUpper(dr[0]));
mPrintf("Type the exact path, from the root.");
mPrintf(" If you want it in the root directory, then just type ");
mPrintf("Return. There is some error checking here, but not much.");
mPrintf(" '?' will abort.");
abort = FALSE;
setSpace(toUpper(dr[0]) - 'A', "");
cd = gcdir("");
good_path(file_data.path, 98);
if (file_data.path[1] != '?') {
if (!ambiguous) {
chdir(file_data.path);
do {
getString("name the file will be stored under on this system",
file_data.filename, NAMESIZE, FALSE, ECHO);
if (strLen(file_data.filename) == 0) abort = TRUE;
else {
temp = safeopen(file_data.filename, "r");
if (temp != NULL) {
fclose(temp);
mPrintf("'%s' already exists, and ", file_data.filename);
mPrintf("will be overwritten during networking.");
goodname = getYesNo("Is this what you want");
}
else goodname = TRUE;
}
} while (!abort && !goodname);
}
else {
mPrintf("Ambiguous requests may result in overwriting.\n ");
file_data.filename[0] = 0;
}
}
else abort = TRUE;
chdir(cd);
free(cd);
setSpace(cfg.homeDisk, "");
if (!abort) {
sPrintf(data, "a:%d.rfl", place);
data[0] = cfg.netDisk + 'a';
temp = safeopen(data, "ab");
if (temp == NULL) {
mPrintf("Couldn't append to '%s'????", data);
}
fwrite(&file_data, sizeof (file_data), 1, temp);
fclose(temp);
netBuf.nbflags.room_files = TRUE;
putNet(place);
}
}
/************************************************************************/
/* roomsShared() Returns true if this system has a room with new */
/* data to share (orSomething) */
/************************************************************************/
roomsShared(slot)
int slot;
{
int i;
for (i = 0; i < SHARED_ROOMS; i++) {
if (isSharedFlag(slot, i)) {
if (roomHiMsgs[netTabRoomSlot(slot, i)] >
sharedRooms[slot].rooms[i].lastMess)
return TRUE;
}
}
return FALSE;
}
/************************************************************************/
/* setSharedRooms() Initializes the roomHiMsgs[] array */
/************************************************************************/
setSharedRooms()
{
ulong findHighestNative();
char *malloc();
int rover, i;
sharedRooms = (struct nodeRoomsTab *) malloc(sizeof (*sharedRooms) *
cfg.netSize);
for (rover = 0; rover < MAXROOMS; rover++) {
if (roomTab[rover].rtflags.SHARED)
roomHiMsgs[rover] = findHighestNative(rover);
else
roomHiMsgs[rover] = 0l;
}
for (rover = 0; rover < cfg.netSize; rover++) {
getNet(rover);
if (netBuf.nbflags.in_use) {
copy_array(netBuf.netRooms, sharedRooms[rover].rooms);
}
}
}
dumpNodeRoom(file)
char file;
{
#ifdef NET_BUG
label name;
int rover;
if (!inNet) {
if (logNetResults && file) {
sPrintf(name, "%c:netlog.sys", cfg.homeDisk + 'a');
netLog = fopen(name, "a");
}
else
netLog = NULL;
}
splitF(netLog, "-- DEBUG: dump of node %s (#%d) --\n", netBuf.netName,
thisNet);
splitF(netLog, "Room list dump:\n");
for (rover = 0; rover < SHARED_ROOMS; rover++) {
splitF(netLog, "Slot %d: room#0x%-9xgen=0x%x", rover,
netBuf.netRooms[rover].srslot,
netBuf.netRooms[rover].srgen);
if (netBuf.netRooms[rover].srgen & 0x8000) {
splitF(netLog, " IN USE apparently\n");
splitF(netLog, "%9croom is %s, gen is 0x%x\n", ' ',
roomTab[netRoomSlot(rover)].rtname,
roomTab[netRoomSlot(rover)].rtgen);
}
else splitF(netLog, "\n");
}
if (!inNet && logNetResults && file)
fclose(netLog);
#endif
}